import json
import threading
import time

import pandas as pd
import requests
import streamlit as st
import pymysql
import random
import datetime

from tags import tags

MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = 3306
MYSQL_USER = "root"
MYSQL_PASSWORD = "G5v3m5e5!"
MYSQL_DB = "random_tag_ygo"

REROLL = 1

st.set_page_config(
    page_title="厄厄杯-线上娱乐赛",
    page_icon="👋",
)

hide_streamlit_style = """
    <style>
        .reportview-container {
            margin-top: -2em;
        }
        #MainMenu {visibility: hidden;}
        .stDeployButton {display:none;}
        footer {visibility: hidden;}
        #stDecoration {display:none;}
    </style>
            """
st.markdown(hide_streamlit_style, unsafe_allow_html=True)

# 连接MySQL数据库
conn = pymysql.connect(
    host=MYSQL_HOST,
    port=MYSQL_PORT,
    user=MYSQL_USER,
    password=MYSQL_PASSWORD,
    database=MYSQL_DB
)

# 创建游标
cursor = conn.cursor()

# 创建user_data表（如果不存在）
cursor.execute("""
    CREATE TABLE IF NOT EXISTS deck_info (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) UNIQUE,
    created_at DATE DEFAULT (CURRENT_DATE)
    )
""")

# Streamlit应用程序
st.markdown("<h1 style='text-align: center;'>🎉厄厄杯-线上娱乐赛🎉</h1>", unsafe_allow_html=True)

# 设定目标日期
target_date = datetime.datetime(2024, 2, 5,13,0)

now = datetime.datetime.now()
countdown = target_date - now

# 格式化显示倒计时
days = countdown.days
hours, remainder = divmod(countdown.seconds, 3600)
minutes, seconds = divmod(remainder, 60)

# 创建一个自定义的HTML和CSS样式
badge_html = """
<div style="
    border: 3px solid #B8860B; 
    border-radius: 15px; 
    text-align: center; 
    color: #B8860B; 
    font-size: 24px; 
    padding: 5px; 
    width: 200px;
    margin: auto;">
    测试阶段
</div>
"""

# 在Streamlit应用中显示它
st.markdown(badge_html, unsafe_allow_html=True)

# 使用Markdown和HTML创建简约的倒计时显示
st.markdown(
    f"<h4 style='text-align: center;'>⏱ 距离比赛还有 : {days} 天 {hours} 小时</h2>",
    unsafe_allow_html=True)


# st.markdown("<h2 style='text-align: center;'>⚠!!! 这只是一个测试功能，不是正式的卡组提交，任何上传的卡组都不会被保存 !!!⚠</h2><br>",unsafe_allow_html=True)
st.markdown('''
在此提交卡组后，可以在**选手查询**看到提交状态\n
不提交卡组无法参加比赛。\n

🟢 以下字段不受限制：**融合**，**升阶魔法**,**No.**,**灵摆** \n
以下原因将导致卡组检查不通过： \n
🔴 使用的卡有字段，该字段不是抽取到的字段，且卡面没有记述抽取到的字段，见**比赛信息**\n
🔴 对应字段的卡数量小于要求\n
🔴 超出2024.1 OCG卡表限制的卡\n
🔴 使用北科服务器还不存在的卡。**请注意卡牌编号不能使用正式的卡片编号，而是使用先行服的卡牌编号。**\n
🔴 其他超出游戏王限制的情况。\n
''')
st.session_state.stage = 0

res_infos = ""

res_check = []

username = st.text_input("请输入比赛昵称:")
verify = st.text_input("请输入验证码:")

deck = st.text_area("将ydk粘贴至此处",height=400)
#
# st.markdown("**或者** 在此上传文件")
#
# uploaded_file = st.file_uploader("上传ydk文件",
#     accept_multiple_files = False, type=["ydk"])
# if uploaded_file is not None:
#     deck = uploaded_file.read().decode("utf-8")

if st.session_state.stage == 0:
    sub = st.button("进行卡组检查")

    if sub:
        if not username or username == "":
            st.error(f"用户名不能为空")
        else:
            cursor.execute("SELECT * FROM random_tags WHERE username=%s", (username,))
            existing_data = cursor.fetchone()
            if existing_data:
                code = existing_data[3]
                if code == verify:
                    elements = str(existing_data[2]).replace(" ", "").split(',')
                    url = 'http://127.0.0.1:5000/card_check'
                    data = {"deck":deck,'tags':elements,'username':username}
                    # 发送POST请求
                    headers = {'Content-Type': 'application/json'}
                    response = requests.post(url, headers=headers,data=json.dumps(data,ensure_ascii=True))

                    response.encoding = 'utf-8'
                    content = json.loads(response.text)
                    # 检查响应状态码
                    if response.status_code == 200:
                        print("POST请求成功")
                        print("响应内容：", content)
                        res_infos = content
                        if res_infos['res'] is True:
                            st.success('''
                            **卡组检查通过！** \n
                            您的卡组检查详细结果如下所示。
                            ''')
                            res_check = res_infos['content']
                            df_datas = []
                            for k, v in res_check.items():
                                df_datas.append([k, "\n,".join(set(v)), len(v)])
                            df1 = pd.DataFrame(df_datas, columns=['字段', '匹配卡片', '数量'])
                            print(df_datas)
                            st.table(df1)
                        else:
                            st.error(f'''
                            **卡组检查失败！** \n
                            {res_infos['content']}
                            ''')
                        st.session_state.stage = 0
                    else:
                        print("POST请求失败，状态码：", response.status_code)
                        res_infos = content
                        st.error(res_infos)
                        st.session_state.stage = 0
                else:
                    st.error(f"选手 **{username}** 验证码不正确！")
            else:
                st.error(f"选手 **{username}** 不存在！")
# if st.session_state.stage == 2:
#     df_datas = []
#     for k,v in df_datas:
#         df_datas.append([k,"\n ".join(v),len(v)])
#     df1 = pd.DataFrame(df_datas, columns=['字段', '匹配卡片','数量'])
#     st.table(df1)

# 关闭数据库连接
cursor.close()
conn.close()
